package com.warm.system.controller.monitor;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.warm.core.domain.AjaxResult;
import com.warm.orm.domain.sys.SysCache;
import com.warm.cache.utils.CacheUtil;
import com.warm.core.constant.CacheConstants;
import org.noear.solon.annotation.*;
import org.noear.solon.validation.annotation.Valid;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 缓存监控
 * TODO min
 *
 * @author warm
 */
@Valid
@Controller
@Mapping("/monitor/cache")
public class CacheController {

    // @Inject
    // public RedisClient client;

    private final static List<SysCache> caches = new ArrayList<SysCache>();

    {
        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
    }

    // @SaCheckPermission("monitor:cache:list")
    // @Get
    // @Mapping()
    // public AjaxResult getInfo() throws Exception
    // {
    //     Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
    //     Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
    //     Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
    //
    //     Map<String, Object> result = new HashMap<>(3);
    //     result.put("info", info);
    //     result.put("dbSize", dbSize);
    //
    //     List<Map<String, String>> pieList = new ArrayList<>();
    //     commandStats.stringPropertyNames().forEach(key -> {
    //         Map<String, String> data = new HashMap<>(2);
    //         String property = commandStats.getProperty(key);
    //         data.put("name", StringUtils.removeStart(key, "cmdstat_"));
    //         data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
    //         pieList.add(data);
    //     });
    //     result.put("commandStats", pieList);
    //     return AjaxResult.success(result);
    // }

    @SaCheckPermission("monitor:cache:list")
    @Get
    @Mapping("/getNames")
    public AjaxResult cache() {
        return AjaxResult.success(caches);
    }

    @SaCheckPermission("monitor:cache:list")
    @Get
    @Mapping("/getKeys/{cacheName}")
    public AjaxResult getCacheKeys(String cacheName) {
        Set<String> cacheKeys = CacheUtil.keys(cacheName + "*");
        return AjaxResult.success(cacheKeys);
    }

    @SaCheckPermission("monitor:cache:list")
    @Get
    @Mapping("/getValue/{cacheName}/{cacheKey}")
    public AjaxResult getCacheValue(String cacheName, String cacheKey) {
        String cacheValue = CacheUtil.getCacheObject(cacheKey, String.class);
        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
        return AjaxResult.success(sysCache);
    }

    @SaCheckPermission("monitor:cache:list")
    @Delete
    @Mapping("/clearCacheName/{cacheName}")
    public AjaxResult clearCacheName(String cacheName) {
        Set<String> cacheKeys = CacheUtil.keys(cacheName + "*");
        CacheUtil.deleteObject(cacheKeys);
        return AjaxResult.success();
    }

    @SaCheckPermission("monitor:cache:list")
    @Delete
    @Mapping("/clearCacheKey/{cacheKey}")
    public AjaxResult clearCacheKey(String cacheKey) {
        CacheUtil.deleteObject(cacheKey);
        return AjaxResult.success();
    }

    @SaCheckPermission("monitor:cache:list")
    @Delete
    @Mapping("/clearCacheAll")
    public AjaxResult clearCacheAll() {
        Set<String> cacheKeys = CacheUtil.keys("*");
        CacheUtil.deleteObject(cacheKeys);
        return AjaxResult.success();
    }
}
